

import * as rollup from 'rollup'
import resolve from '@rollup/plugin-node-resolve'
import path from 'path';
import { fileURLToPath } from 'node:url'

const __dirname = path.dirname(fileURLToPath(import.meta.url)); 

const setup = async () => {

  const input = path.resolve(__dirname, 'index.js'); // 输入文件路径

  // 配置虚拟模块内容（这里简单示例，可根据实际需求定制更复杂的逻辑）
  const virtualModuleContent = `
    import { add } from './a.js;
    
    const result = add(1, 2);

    result;
  `;

  // 创建Rollup实例，配置输入选项，使用虚拟模块作为入口，并添加插件帮助解析模块路径
  const bundle = await rollup.rollup({
    input: 'virtual-entry', // 虚拟入口名称，可自定义
    plugins: [
      resolve({
        extensions: ['.js'], // 指定解析的文件扩展名，可根据实际项目添加更多类型
        skip: [/^virtual-entry/], // 添加这行，告诉插件跳过对 virtual-entry 的常规文件查找
      }),
      {
        // 添加 resolveId 钩子来处理虚拟入口模块的解析
        resolveId: function (source, importer, options) {
          if (source === 'virtual-entry') {
            return {
              id: 'virtual-entry',
              external: false
            };
          }
          return null;
        }
      }
    ],
    // 使用 Rollup 的插件机制创建虚拟模块
    onwarn(warning, warn) {
      if (warning.code === 'UNRESOLVED_IMPORT') {
        if (warning.source === 'virtual-entry') {
          // 针对虚拟入口模块，创建虚拟模块对象并返回
          const virtualModule = {
            id: 'virtual-entry',
            code: virtualModuleContent,
            meta: {
              isEntry: true
            }
          };
          console.log('正在处理虚拟入口模块逻辑，返回虚拟模块对象', virtualModule); // 添加这行，便于查看处理情况
          return virtualModule;
        }
      }
      warn(warning);
    }
  });

  // 配置输出选项，定义输出文件路径、格式等（这里暂不输出文件，先获取合并后的代码字符串）
  const generateOptions = {
    format: 'esm', // 输出格式为 ES 模块格式，可根据实际需求换为 'cjs'（CommonJS）等其他格式
    sourcemap: false // 这里不生成 sourcemap 文件，若需要可设为 true
  };

  // 生成代码（执行模块合并操作，获取合并后的代码字符串）
  const { output } = await bundle.generate(generateOptions);
  const mergedCode = output[0].code; // 获取合并后的代码字符串

  console.log('通过Rollup API完成模块合并，合并后的代码为：', mergedCode);

  // 后续可以根据需求对 mergedCode 进行处理，比如挂载到变量上、传递给其他函数等

}

setup();